package com.wlz.service;

/**
 * @author wlz
 * @date 2022-06-01  9:37 下午
 */
public interface PayService {

	/**
	 *  支付
	 * @param accountId
	 * @param money
	 */
	void pay(String accountId,double money);

	/**
	 *  更新 商品
	 * @param productId
	 */
	void updateProductStore(Integer productId);


	/**
	 *  PROPAGATION_REQUIRED (默认)
	 *  支持当前事务，如果当前没有事务，则新建事务
	 *  如果当前存在事务，则加入当前事务，合并成一个事务
	 * @param accountId
	 * @param money
	 */
	void payPropagationRequired(String accountId,double money);

	/**
	 * PROPAGATION_REQUIRED (默认)
	 *  支持当前事务，如果当前没有事务，则新建事务
	 *  如果当前存在事务，则加入当前事务，合并成一个事务
	 * @param productId
	 */
	void updateProductStorePropagationRequired(Integer productId);


	/**
	 *  PROPAGATION_SUPPORTS
	 *  如果当前存在事务，则加入事务
	 *  如果当前不存在事务，则以非事务方式运行，这个和不写没区别
	 * @param accountId
	 * @param money
	 */
	void payPropagationSupports(String accountId,double money);

	/**
	 *  PROPAGATION_SUPPORTS
	 *  如果当前存在事务，则加入事务
	 *  如果当前不存在事务，则以非事务方式运行，这个和不写没区别
	 * @param productId
	 */
	void updateProductStorePropagationSupports(Integer productId);


	/**
	 *  PROPAGATION_MANDATORY
	 *  如果当前存在事务，则运行在当前事务中
	 *  如果当前无事务，则抛出异常，也即父级方法必须有事务
	 * @param accountId
	 * @param money
	 */
	void payPropagationMandatory(String accountId,double money);

	/**
	 *  PROPAGATION_MANDATORY
	 *  如果当前存在事务，则运行在当前事务中
	 *  如果当前无事务，则抛出异常，也即父级方法必须有事务
	 * @param productId
	 */
	void updateProductStorePropagationMandatory(Integer productId);


	/**
	 *  PROPAGATION_REQUIRES_NEW
	 *  新建事务，如果当前存在事务，则把当前事务挂起
	 * 这个方法会独立提交事务，不受调用者的事务影响，父级异常，它也是正常提交
	 * @param accountId
	 * @param money
	 */
	void payPropagationRequiresNew(String accountId,double money);

	/**
	 *  PROPAGATION_REQUIRES_NEW
	 *  新建事务，如果当前存在事务，则把当前事务挂起
	 * 这个方法会独立提交事务，不受调用者的事务影响，父级异常，它也是正常提交
	 * @param productId
	 */
	void updateProductStorePropagationRequiresNew(Integer productId);


	/**
	 *  NOT_SUPPORTED
	 *  以非事务方式运行
	 * 如果当前存在事务，则把当前事务挂起
	 * @param accountId
	 * @param money
	 */
	void payPropagationNotSupported(String accountId,double money);

	/**
	 *  NOT_SUPPORTED
	 *  以非事务方式运行
	 * 如果当前存在事务，则把当前事务挂起
	 * @param productId
	 */
	void updateProductStorePropagationNotSupported(Integer productId);

	/**
	 *  NEVER
	 *  以非事务方式运行，如果当前存在事务，则抛出异常，即父级方法必须无事务
	 * @param accountId
	 * @param money
	 */
	void payPropagationNever(String accountId,double money);

	/**
	 *  NEVER
	 *  以非事务方式运行，如果当前存在事务，则抛出异常，即父级方法必须无事务
	 * @param productId
	 */
	void updateProductStorePropagationNever(Integer productId);

	/**
	 *  NESTED
	 *  如果当前存在事务，它将会成为父级事务的一个子事务，方法结束后并没有提交，只有等父事务结束才提交
	 * 如果当前没有事务，则新建事务
	 * 如果它异常，父级可以捕获它的异常而不进行回滚，正常提交
	 * 但如果父级异常，它必然回滚，这就是和 REQUIRES_NEW 的区别
	 * @param accountId
	 * @param money
	 */
	void payPropagationNested(String accountId,double money);

	/**
	 *  NESTED
	 * 如果当前存在事务，它将会成为父级事务的一个子事务，方法结束后并没有提交，只有等父事务结束才提交
	 * 如果当前没有事务，则新建事务
	 * 如果它异常，父级可以捕获它的异常而不进行回滚，正常提交
	 * 但如果父级异常，它必然回滚，这就是和 REQUIRES_NEW 的区别
	 * @param productId
	 */
	void updateProductStorePropagationNested(Integer productId);

}
